package com.example.leetcode.trainingcamp.week12;

/**
 * 配对交换。编写程序，交换某个整数的奇数位和偶数位，尽量使用较少的指令（也就是说，位0与位1交换，位2与位3交换，以此类推）。
 *
 * 示例1:
 *
 *  输入：num = 2（或者0b10）
 *  输出 1 (或者 0b01)
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/exchange-lcci
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class Test05_07 {

    //   0011
    //   1100

    public int exchangeBits(int num) {
        int[] bits = new int[32];
        int mask = 1;
        for (int i = 0;i<32;i++){
            if ((mask & num) != 0){
                bits[i] = 1;
            }
            mask <<= 1;
        }
        int r = 0;
        int mask2 = 1;
        for (int i=0;i<32;i+=2){
            swap(bits,i,i+1);
            r += bits[i] * mask2;
            mask2 <<= 1;
            r += bits[i+1] *mask2;
            mask2 <<= 1;
        }
        return r;
    }

    private void swap(int[] bits,int source,int target){
        int t = bits[source];
        bits[source] = bits[target];
        bits[target] = t;
    }


    public static void main(String[] args) {
        Test05_07 t = new Test05_07();
        System.out.println(t.exchangeBits(3));
    }

}
